/**
 ******************************************************************************
 * @file           : bsp_iic_gpio.h
 * @brief          : Software IIC Driver Header File (STM32F1xx)
 ******************************************************************************
 * @attention
 *
 * GPIO模拟I2C（软件I2C）驱动程序头文件
 * 基于GPIO模拟I2C通信协议
 * 支持标准I2C时序和多设备通信
 * 提供完整的I2C主机功能
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_IIC_GPIO_H
#define __BSP_IIC_GPIO_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/* Exported types ------------------------------------------------------------*/
/**
 * @brief IIC错误码枚举
 */
typedef enum
{
    IIC_OK = 0,                 /*!< 成功 */
    IIC_ERROR_PARAM,            /*!< 参数错误 */
    IIC_ERROR_TIMEOUT,          /*!< 超时错误（无ACK应答） */
    IIC_ERROR_BUSY,             /*!< 总线忙 */
    IIC_ERROR_NACK              /*!< 接收到NACK */
} IIC_Error_e;

/**
 * @brief IIC状态枚举
 */
typedef enum
{
    IIC_STATE_IDLE = 0,         /*!< 空闲状态 */
    IIC_STATE_BUSY,             /*!< 忙状态 */
    IIC_STATE_TX,               /*!< 发送状态 */
    IIC_STATE_RX,               /*!< 接收状态 */
    IIC_STATE_ERROR             /*!< 错误状态 */
} IIC_State_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void iic_init(void);                                                            /* IIC初始化 */
void iic_deinit(void);                                                          /* IIC反初始化 */

/* 基础时序函数 */
void iic_start(void);                                                           /* 发送起始信号 */
void iic_stop(void);                                                            /* 发送停止信号 */
void iic_ack(void);                                                             /* 发送ACK */
void iic_nack(void);                                                            /* 发送NACK */
uint8_t iic_wait_ack(void);                                                     /* 等待ACK */

/* 字节读写函数 */
void iic_send_byte(uint8_t data);                                               /* 发送一个字节 */
uint8_t iic_recv_byte(uint8_t ack);                                             /* 接收一个字节 */

/* 高级读写函数（带错误处理） */
IIC_Error_e iic_write_bytes(uint8_t addr, uint8_t reg, const uint8_t *data, uint16_t len);  /* 写多字节 */
IIC_Error_e iic_read_bytes(uint8_t addr, uint8_t reg, uint8_t *data, uint16_t len);         /* 读多字节 */
IIC_Error_e iic_write_byte(uint8_t addr, uint8_t reg, uint8_t data);           /* 写单字节 */
IIC_Error_e iic_read_byte(uint8_t addr, uint8_t reg, uint8_t *data);           /* 读单字节 */

/* 设备扫描函数 */
IIC_Error_e iic_scan_device(uint8_t addr);                                      /* 扫描设备地址 */
void iic_scan_all_devices(void);                                                /* 扫描所有设备 */

/* 状态查询函数 */
IIC_State_e iic_get_state(void);                                                /* 获取IIC状态 */
uint8_t iic_is_device_ready(uint8_t addr, uint8_t retry);                       /* 检查设备就绪 */

/* 调试接口 */
void iic_print_status(void);                                                    /* 打印IIC状态 */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_IIC_GPIO_H */
